package com.cbd.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.cbd.dto.AdminDto;
import com.cbd.log.LogOut;
import com.cbd.log.OpLog;
import com.cbd.service.ISuperAdminService;
import com.cbd.util.ResultResponse;
import com.cbd.util.StatusEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * @Author: xue
 * @Date: 2024/11/25 11:17
 * @Description:超级管理员控制器
 */
@RestController
@RequestMapping("/superAdmin")
@Slf4j
@Api(tags = "超级管理员接口")
public class SuperAdminController {
    @Resource
    private ISuperAdminService superAdminService;

    @PostMapping("/login")
    @ApiOperation(value = "管理员登录", notes = "管理员登录接口")
    @OpLog(type = "登录", info = "进行了登录")
    public ResultResponse<String> login(
            @ApiParam(name = "adminDto",  value = "用户登录信息", required = true)
            @RequestBody AdminDto adminDto) {
        log.info("管理员登录请求：{}", adminDto);
        if (superAdminService.login(adminDto)) {
            //生成token并保存状态信息
            StpUtil.login(adminDto.getUsername());
            log.info("管理员登录成功", adminDto.getUsername());
            //返回包含token的响应
            return ResultResponse.success("登录成功");
        }
        log.error("管理员登录失败", adminDto.getUsername());
        return ResultResponse.error(StatusEnum.ERROR, "用户名或者密码错误");
    }

    @PostMapping("/logout")
    @ApiOperation(value = "管理员退出", notes = "管理员退出接口")
    @LogOut(type = "注销", info = "进行了注销")
    public ResultResponse<String> logout() {
        String username = StpUtil.getLoginIdAsString(); //获取当前登录的账号
        StpUtil.logout(); //退出登录
        log.info("管理员{}已退出登录", username);
        return ResultResponse.success("退出登录成功");
    }

    @PostMapping("/isLogin")
    @ApiOperation(value = "判断管理员是否登录", notes = "判断是否登录接口")
    public ResultResponse<String> isLogin() {
        if (StpUtil.isLogin()) { //判断管理员是否登录
            String username = StpUtil.getLoginIdAsString();
            log.info("管理员{}已登录", username);
            SaTokenInfo saTokenInfo = StpUtil.getTokenInfo(); //获取当前登录用户的token信息
            log.info("token信息：{}", saTokenInfo);
            return ResultResponse.success("已登录");
        }
        log.error("管理员未登录");
        return ResultResponse.error(StatusEnum.ERROR, "未登录");
    }

    @PostMapping("/addAdmin")
    @ApiOperation(value = "添加管理员", notes = "添加管理员接口")
    @SaCheckRole("超级管理员")
    @SaCheckPermission("增加管理员")
    public ResultResponse<String> addAdmin() {
        log.info("添加管理员成功");
        return ResultResponse.success("添加管理员成功");
    }

    @PostMapping("/deleteAdmin")
    @ApiOperation(value = "删除管理员", notes = "删除管理员接口")
    @SaCheckRole("超级管理员")
    @SaCheckPermission("删除管理员")
    public ResultResponse<String> deleteAdmin() {
        log.info("删除管理员成功");
        return ResultResponse.success("删除管理员成功");
    }

    @PostMapping("/queryAdmin")
    @ApiOperation(value = "查询管理员", notes = "查询管理员接口")
    @SaCheckRole("超级管理员")
    @SaCheckPermission("查看管理员")
    public ResultResponse<String> queryAdmin() {
        log.info("查询管理员成功");
        return ResultResponse.success("查询管理员成功");
    }

    @PostMapping("/managerUserStatus")
    @ApiOperation(value = "用户状态", notes = "用户状态接口")
    @SaCheckRole(value = {"用户管理员", "超级管理员"}, mode = SaMode.OR)
    @SaCheckPermission("管理用户状态")
    public ResultResponse<String> managerUserStatus() {
        log.info("用户状态管理成功");
        return ResultResponse.success("用户状态修改成功");
    }

    @GetMapping("/modifyUserStatus")
    @ApiOperation(value = "修改用户状态", notes = "修改用户状态接口")
    @SaCheckRole(value = {"用户管理员", "超级管理员"}, mode = SaMode.OR)
    @SaCheckPermission("修改用户信息")
    public ResultResponse<String> modifyUserStatus() {
        log.info("用户状态修改成功");
        return ResultResponse.success("用户状态修改成功");
    }

    @PostMapping("/queryUserDetail")
    @ApiOperation(value = "查看用户详情", notes = "查看用户详情接口")
    @SaCheckRole(value = {"用户管理员", "超级管理员"},  mode = SaMode.OR)
    @SaCheckPermission("查看用户信息")
    public ResultResponse<String> queryUserStatus() {
        log.info("用户状态查询成功");
        return ResultResponse.success("用户状态查询成功");
    }

    @GetMapping("/parkingPlace")
    @ApiOperation(value = "车位管理", notes = "车位管理接口")
    @SaCheckRole(value = {"车位管理员", "超级管理员"}, mode = SaMode.OR)
    @SaCheckPermission("车位管理")
    public ResultResponse<String> parkingPlace() {
        log.info("车位管理成功");
        return ResultResponse.success("车位管理成功");
    }

    @PostMapping("/contractManager")
    @ApiOperation(value = "合同管理", notes = "合同管理接口")
    @SaCheckRole(value = {"超级管理员", "合同管理员"},  mode = SaMode.OR)
    @SaCheckPermission("合同管理")
    public ResultResponse<String> contractManager() {
        log.info("合同管理成功");
        return ResultResponse.success("合同管理成功");
    }

    @PostMapping("/complaintManager")
    @ApiOperation(value = "投诉管理",  notes = "投诉管理接口")
    @SaCheckRole(value = {"超级管理员", "客服"}, mode = SaMode.OR) //多个角色，只要有其中一个角色即可访问
    @SaCheckPermission("投诉管理")
    public ResultResponse<String> complaintManager() {
        log.info("投诉管理成功");

        return ResultResponse.success("投诉管理成功");
    }

    @PostMapping("/backStageManager")
    @ApiOperation(value = "后台管理", notes = "后台管理接口")
    @SaCheckRole(value = {"运维管理员", "超级管理员"}, mode = SaMode.OR) //多个角色，只要有其中一个角色即可访问"超级管理员")
    @SaCheckPermission("后台管理")
    public ResultResponse<String> backStageManager() {
        log.info("后台管理成功");
        return ResultResponse.success("后台管理成功");
    }
}
